/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controlador;

import ws.*;
import com.standbysoft.component.date.swing.JDatePicker;
import com.thoughtworks.xstream.XStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import modelo.Persona;
import vista.VentanaPrincipal;

/**
 *
 * @author Jesús Vásquez
 */
public class ControladorGeneral {

    Bebe bebe;
    Consulta consulta;
    File directorio;
    XStream archivoXStream;
    XStream xs;
    List listaXml;
    private List<Bebe> listaBebe;
    static String nombreArchivo;
    String[] archivos;
    XStream archivoXStreamPersona;

    public ControladorGeneral() {
        archivoXStream = new XStream();
        listaXml = new ArrayList();
        directorio = new File(System.getProperty("user.dir") + "\\archivo");
        archivos = directorio.list();
        bebe = new ws.Bebe();
        consulta = new Consulta();
        nombreArchivo = "ArchivosUsuario.xml";
    }

    public void resgistrarBebeLocal(JTextField nombre, JTextField apellido, JTextField cedula, JDatePicker fecha) {

        String nombreBebe;
        String apellidoBebe;
        String cedulaPadreMadre;
        String fechaNacimiento;

        nombreBebe = nombre.getText();
        apellidoBebe = apellido.getText();
        cedulaPadreMadre = cedula.getText();
        fechaNacimiento = fecha.getSelectedDate().toString();

        if (nombreBebe.equals("") || apellidoBebe.equals("") || cedulaPadreMadre.equals("")) {
            JOptionPane.showMessageDialog(null,
                    "Todos los campos son obligatorios",
                    "Advetencia",
                    JOptionPane.WARNING_MESSAGE);
        } else {

            agregarBebeAlArchivoXml(nombreBebe, apellidoBebe, cedulaPadreMadre, fechaNacimiento);

        }
    }

    public void actualizarBebeLocal(JTextField estatura, JTextField peso, JTextField circunferencia, JTextField edad, JComboBox comboBox, List<Bebe> lista_bebe) {
        String estaturaBebe;
        String pesoBebe;
        String circunferenciaBebe;
        String edadBebe;
        String fechaDeConsulta;
        Date fechaActual;

        fechaActual = new Date();

        SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");

        estaturaBebe = estatura.getText();
        pesoBebe = peso.getText();
        circunferenciaBebe = circunferencia.getText();
        edadBebe = edad.getText();
        fechaDeConsulta = formato.format(fechaActual);

        if (estaturaBebe.isEmpty() || pesoBebe.isEmpty()
                || circunferenciaBebe.isEmpty()
                || edadBebe.isEmpty() || fechaDeConsulta.isEmpty()) {
            JOptionPane.showMessageDialog(null,
                    "Todos los campos deben estar llenos",
                    "Advetencia",
                    JOptionPane.WARNING_MESSAGE);
        } else {
            consulta.setCircunferenciaCefalica(circunferenciaBebe);
            consulta.setEstatura(estaturaBebe);
            consulta.setPeso(pesoBebe);
            consulta.setFecha(fechaDeConsulta);
            consulta.setEdad(edadBebe);

            agregarConsultaAlArchivoXml(comboBox, consulta, listaBebe);
        }
    }

    public void leerArchivo() {

        for (int x = 0; x < archivos.length; x++) {
            nombreArchivo = archivos[x];
        }

        try {
            FileInputStream fis = new FileInputStream(directorio + "\\" + "ArchivosUsuario.xml");
            setListaBebe((List<Bebe>) archivoXStream.fromXML(fis));

        } catch (FileNotFoundException fnfex) {
            JOptionPane.showMessageDialog(null,
                    "No existe ningún archivo de consultas...",
                    "Advertencia",
                    JOptionPane.WARNING_MESSAGE);
        }

    }

    public int agregarBebeAlArchivoXml(String nombre, String apellido, String ci_padre, String fecha_nacimiento) {
        List<Bebe> lista_bebe;
        int id;

        lista_bebe = getListaBebe();

        if (lista_bebe == null) {
            bebe.setId(1);
            bebe.setNombre(nombre);
            bebe.setApellido(apellido);
            bebe.setCiPadre(ci_padre);
            bebe.setFechaNacimiento(fecha_nacimiento);

            lista_bebe = new ArrayList<Bebe>();
            lista_bebe.add(bebe);
            xs = new XStream();
        } else {
            xs = new XStream();

            id = lista_bebe.size();
            bebe.setId(id + 1);
            bebe.setNombre(nombre);
            bebe.setApellido(apellido);
            bebe.setCiPadre(ci_padre);
            bebe.setFechaNacimiento(fecha_nacimiento);
            lista_bebe.add(bebe);
        }
        try {
            FileOutputStream fs = new FileOutputStream(directorio + "\\" + "ArchivosUsuario.xml");
            xs.toXML(lista_bebe, fs);
        } catch (FileNotFoundException e1) {
            JOptionPane.showMessageDialog(null,
                    "No se encuentra el archivo",
                    "Advertencia",
                    JOptionPane.WARNING_MESSAGE);
        }


        return 0;
    }

    public void registrarBebeWebService(JTextField nombre, JTextField apellido, JTextField cedula, JDatePicker fecha) {
        String fechaNacimiento;
        String nombreBebe;
        String apellidoBebe;
        String cedulaBebe;
        Consultorio puerto;
        Consultorio_Service servicio = new Consultorio_Service();
        int respuestaServidor;

        try {
            puerto = servicio.getConsultorioPort();
            SimpleDateFormat MiFormato = new SimpleDateFormat("dd/MM/yyyy");
            nombreBebe = nombre.getText();
            apellidoBebe = apellido.getText();
            cedulaBebe = cedula.getText();
            fechaNacimiento = MiFormato.format(fecha.getSelectedDate());

            respuestaServidor = puerto.registrarBebe(nombreBebe, apellidoBebe, cedulaBebe, fechaNacimiento);

            if (respuestaServidor == 0) {
                JOptionPane.showMessageDialog(null,
                        "No se pudo establecer la conexión con el Web Service",
                        "Advertencia",
                        JOptionPane.WARNING_MESSAGE);
            } else if (respuestaServidor == 1) {
                JOptionPane.showMessageDialog(null,
                        "Bebé registrado con éxito",
                        "Mensaje",
                        JOptionPane.WARNING_MESSAGE);
            }

        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null,
                    "No se pudo establecer la conexión con el Web Service",
                    "Advertencia",
                    JOptionPane.WARNING_MESSAGE);
        }
    }

    public void registrarBebe(JTextField nombre, JTextField apellido, JTextField cedula, JDatePicker fecha) {
        try {
            resgistrarBebeLocal(nombre, apellido, cedula, fecha);
            JOptionPane.showMessageDialog(null,
                    "Información procesada de forma local",
                    "Mensaje",
                    JOptionPane.INFORMATION_MESSAGE);
            registrarBebeWebService(nombre, apellido, cedula, fecha);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null,
                    "Error al realizar el registro",
                    "Advertencia",
                    JOptionPane.WARNING_MESSAGE);
        }
    }

    public void listarBebes() {
        Consultorio puerto;
        Consultorio_Service servicio = new Consultorio_Service();

        try {
            puerto = servicio.getConsultorioPort();
            setListaBebe(puerto.actualizarHistorial());
        } catch (Exception ex) {
            leerArchivo();
        }
    }

    public void actualizarBebe(JComboBox comboBebe, JTextField estatura, JTextField peso, JTextField circunferencia, JTextField edad, List<Bebe> bebes) {

        try {
            actualizarBebeLocal(estatura, peso, circunferencia, edad, comboBebe, bebes);
            JOptionPane.showMessageDialog(null,
                    "Información procesada de forma local",
                    "Mensaje",
                    JOptionPane.INFORMATION_MESSAGE);

            actualizarBebeWebService(comboBebe, estatura, peso, circunferencia, edad);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null,
                    "Error al realizar el registro",
                    "Advertencia",
                    JOptionPane.WARNING_MESSAGE);

        }

    }

    public void actualizarBebeWebService(JComboBox comboBebe, JTextField estatura, JTextField peso, JTextField circunferencia, JTextField edad) {

        Consultorio puerto;
        Consultorio_Service servicio = new Consultorio_Service();
        String estaturaBebe;
        String pesoBebe;
        String circunferenciaBebe;
        String edadBebe;
        String fechaDeConsulta;
        Date fechaActual;
        int respuestaServidor;
        int idBebe;

        try {
            fechaActual = new Date();
            puerto = servicio.getConsultorioPort();

            SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");

            if (comboBebe.getSelectedIndex() > 0) {
                estaturaBebe = estatura.getText();
                pesoBebe = peso.getText();
                circunferenciaBebe = circunferencia.getText();
                edadBebe = edad.getText();
                fechaDeConsulta = formato.format(fechaActual);
                idBebe = obtenerIdBebe(comboBebe);

                if (estaturaBebe.isEmpty() || pesoBebe.isEmpty()
                        || circunferenciaBebe.isEmpty()
                        || edadBebe.isEmpty() || fechaDeConsulta.isEmpty()) {
                    JOptionPane.showMessageDialog(null,
                            "Todos los campos deben estar llenos",
                            "Advetencia",
                            JOptionPane.WARNING_MESSAGE);
                } else {
                    consulta.setCircunferenciaCefalica(circunferenciaBebe);
                    consulta.setEstatura(estaturaBebe);
                    consulta.setPeso(pesoBebe);
                    consulta.setFecha(fechaDeConsulta);
                    consulta.setEdad(edadBebe);

                    respuestaServidor = puerto.subirConsulta(consulta, idBebe);

                    if (respuestaServidor == 0) {
                        JOptionPane.showMessageDialog(null,
                                "No se pudo establecer la conexión con el Web Service",
                                "Advertencia",
                                JOptionPane.WARNING_MESSAGE);
                    } else if (respuestaServidor == 1) {
                        JOptionPane.showMessageDialog(null,
                                "Bebé registrado con éxito",
                                "Mensaje",
                                JOptionPane.WARNING_MESSAGE);
                    }
                }
            } else {
                JOptionPane.showMessageDialog(null,
                        "Seleccione un campo válido",
                        "Advetencia",
                        JOptionPane.WARNING_MESSAGE);
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null,
                    "Error al establecer conexión con el Web Service",
                    "Advertencia",
                    JOptionPane.WARNING_MESSAGE);

        }
    }

    /**
     * @return the listaBebe
     */
    public List<Bebe> getListaBebe() {
        return listaBebe;
    }

    /**
     * @param listaBebe the listaBebe to set
     */
    public void setListaBebe(List<Bebe> listaBebe) {
        this.listaBebe = listaBebe;
    }

    public int obtenerIdBebe(JComboBox comboBox) {

        String nombreCombo;
        char identificadorBebe;
        int idBebe;

        nombreCombo = comboBox.getSelectedItem().toString();

        identificadorBebe = nombreCombo.charAt(0);
        idBebe = Integer.parseInt(String.valueOf(identificadorBebe));

        return idBebe;
    }

    public void iniciarSesion(JFrame ventana) {
        VentanaPrincipal ventanaPrincipal;
        ventanaPrincipal = new VentanaPrincipal();

        ventana.setVisible(false);
        ventana.dispose();

        ventanaPrincipal.setVisible(true);
    }

    public void leerArchivoPersona(JFrame ventana, JTextField login, JPasswordField pass) {

        List<Persona> lista_persona = null;
        String usuario;
        String clave;

        usuario = login.getText();
        clave = pass.getText();
        archivoXStreamPersona = new XStream();

        try {
            FileInputStream fis = new FileInputStream(directorio + "\\" + "ArchivosPersona.xml");
            lista_persona = ((List<Persona>) archivoXStreamPersona.fromXML(fis));

        } catch (FileNotFoundException fnfex) {
            JOptionPane.showMessageDialog(null,
                    "No existe ningún archivo de usuarios...",
                    "Advertencia",
                    JOptionPane.WARNING_MESSAGE);
        }

        for (Persona persona : lista_persona) {
            if (persona.getNombre().equals(usuario) && persona.getPass().equals(clave)) {
                iniciarSesion(ventana);
            } else {
                JOptionPane.showMessageDialog(null,
                        "Introduzca login y password correctos",
                        "Advertencia",
                        JOptionPane.WARNING_MESSAGE);
            }
        }
    }

    public int agregarConsultaAlArchivoXml(JComboBox comboBox, Consulta consulta, List<Bebe> listaBebe) {
        int idBebe;
        List<Bebe> lista_bebe;

        idBebe = obtenerIdBebe(comboBox);
        lista_bebe = listaBebe;

        for (Bebe bebe1 : lista_bebe) {
            if (bebe1.getId() == idBebe) {
                bebe1.getListaConsulta().add(consulta);
            }
        }

        xs = new XStream();

        try {
            FileOutputStream fsb = new FileOutputStream(directorio + "\\" + "ArchivosUsuario.xml");
            xs.toXML(lista_bebe, fsb);
        } catch (FileNotFoundException e1) {
            JOptionPane.showMessageDialog(null,
                    "No se encuentra el archivo",
                    "Advertencia",
                    JOptionPane.WARNING_MESSAGE);
        }


        return 0;
    }
}
